package com.czg.jsonschema2lombokpojo.rules;

import java.lang.annotation.Annotation;

import com.czg.jsonschema2lombokpojo.Schema;

import com.fasterxml.jackson.databind.JsonNode;
import com.sun.codemodel.JDocCommentable;
import com.sun.codemodel.JFieldVar;

import jakarta.validation.constraints.NotNull;

/**
 * 应用“必需的”schema规则。
 *
 */
public class RequiredRule implements Rule<JDocCommentable, JDocCommentable> {

    private final RuleFactory ruleFactory;

    protected RequiredRule(RuleFactory ruleFactory) {
        this.ruleFactory = ruleFactory;
    }

    /**
     * 应用此schema规则执行所需的代码生成步骤。
     * <p>
     * 所需规则只是在JavaDoc注解中添加一个注解，以标记所需的属性。
     *
     * @param nodeName
     *            已为其添加此“必需”规则的schema节点的名称
     * @param node
     *            “required”节点，其值<code>true</code>或<code>false</code>
     * @param parent
     *            父节点
     * @param generatableType
     *            可以标记为“必需”的类或方法
     * @return 附加到generatableType的JavaDoc注解，其中<em>可能</em>添加了不标记此结构所需的注解。
     */
    @Override
    public JDocCommentable apply(String nodeName, JsonNode node, JsonNode parent, JDocCommentable generatableType, Schema schema) {

        if (node.asBoolean()) {
            generatableType.javadoc().append("\n(Required)");

            if (ruleFactory.getGenerationConfig().isIncludeValidationAnnotations()
                    && generatableType instanceof JFieldVar) {
                final Class<? extends Annotation> notNullClass
                        = ruleFactory.getGenerationConfig().isUseJakartaValidation()
                        ? NotNull.class
                        : javax.validation.constraints.NotNull.class;
                ((JFieldVar) generatableType).annotate(notNullClass);
            }
        }
        return generatableType;
    }
}
